package com.atguigu.gulimall.order.listener;


import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gulimall.order.config.AlipayTemplate;
import com.atguigu.gulimall.order.service.OrderService;
import com.atguigu.gulimall.order.vo.PayAsyncVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

@RestController
public class OrderPaidListener {


    @Autowired
    private AlipayTemplate alipayTemplate;



    @Autowired
    private OrderService orderService;


//支付成功的回调
    @PostMapping("/paid/notify")
    public String   handleAlipaid(PayAsyncVo payAsyncVo, HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {

        //  注意:PayAsyncVo 是支付宝给我们返回的结果
        //   只要我们收到了支付宝给我们异步的通知. 告诉我们订单支付成功,那我们就返回success,支付宝就再也不通知了

        //   验证签名:

        Map<String,String> params = new HashMap<>();  //  创建一个容器,后续 验签 使用
        Map<String,String[]> requestParams = request.getParameterMap(); //  获取支付宝的参数信息
        Set<String> keys = requestParams.keySet();  //  获取所有的键
        Iterator<String> iterator = keys.iterator(); //  通过所有的键获取迭代器
        while (iterator.hasNext()){  //  遍历迭代器
            String name = (String) iterator.next();  // 获取每一个key的名字

            String[] values = (String[]) requestParams.get(name);   //  通过key获取value ,value是一个数组

            String valueStr = "";  //  创建一个容器

            for (int i = 0; i < values.length; i++) {   // 假设 value的长度是5,length是5 ,那么他的下标是 0,1,2,3,4
//                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                String value = values[i];    //
                if(i == values.length-1){
                    valueStr  =   valueStr +value;
                }else {
                    valueStr =  value+",";
                }
            }//    这个for循环,整了这么半天,就是为了把数组用逗号连起来?那为什么不直接用String.join()?
            //乱码解决，这段代码在出现乱码时使用
//            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr); // 然后把参数和参数值放进params里面,也算是一种处理吧...
        }

//        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(), alipayTemplate.getCharset(), alipayTemplate.getSign_type()); //调用SDK验证签名

        if(true){
            System.out.println("签名验证成功");


        String  result=orderService.handlePayResult(payAsyncVo);  //  TODO  这又是什么方法? 返回的结果又是什么?
        return result;
        }else{
            System.out.println("签名验证失败");
            return  "error";
        }





    }






}
